method: ResolveMethod,
ctx: &mut Context<'a, R>)
-> CargoResult<()> {
- // Dependency graphs are required to be a DAG
- if !ctx.visited.insert(parent.get_package_id().clone()) {
- return Err(human(format!("Cyclic package dependency: package `{}` \
- depends on itself", parent.get_package_id())))
- }
-
let dev_deps = match method {
ResolveEverything => true,
ResolveRequired(dev_deps, _, _) => dev_deps,
ctx.seen.insert((name, source_id), version.clone());
ctx.resolve.graph.add(summary.get_package_id().clone(), []);
}
+
+ // Dependency graphs are required to be a DAG. Non-transitive
+ // dependencies (dev-deps), however, can never introduce a cycle, so we
+ // skip them.
+ if dep.is_transitive() &&
+ !ctx.visited.insert(summary.get_package_id().clone()) {
+ return Err(human(format!("Cyclic package dependency: package `{}` \
+ depends on itself",
+ summary.get_package_id())))
+ }
try!(resolve_deps(summary,
ResolveRequired(false, dep.get_features(),
dep.uses_default_features()),
ctx));
+ if dep.is_transitive() {
+ ctx.visited.remove(summary.get_package_id());
+ }
}
- ctx.visited.remove(parent.get_package_id());
Ok(())
}
"#)
.file("src/test.rs", "fn main() {}");
assert_that(p.cargo_process("build"),
- execs().with_status(101).with_stderr("\
-Cyclic package dependency: package `test v0.0.0 ([..])` depends on itself
+ execs().with_status(0).with_stdout("\
+[..] test v0.0.0 ([..])
"));
})